// 表示位置的类型，可以是字符串或数字的数组
export type Location = Array<number>;

export type Position = {
    location: Location;
    offset: number;
    moveToContext?: boolean; // 是否在上下文中移动
}

// 输入框输入完成事件的请求接口
export interface InputCompleteRequest {
    type: 'inputComplete'; // 请求类型
    location: Location; // 当前输入框在文档中的位置
    inputValue: string; // 输入值
}

// 删除请求的接口
export interface DeleteRequest {
    type: 'delete'; // 请求类型
    location: Location; // 当前输入框在文档中的位置
}

// 换行请求的接口
export interface NextLineRequest {
    type: 'nextLine'; // 请求类型
    location: Location; // 换行位置
}

// 完成上下文请求的接口
export interface CompleteContextRequest {
    type: 'completeContext'; // 请求类型
    location: Location; // 结束位置
}

// 聚焦元素请求的接口
export interface FocusElementRequest {
    type: 'focusElement'; // 请求类型
    location?: Location; // 可选，聚焦位置，为空表示无元素聚焦
}

// 请求类型，可以是输入完成、删除、换行、完成上下文、聚焦元素请求
export type Request = InputCompleteRequest | DeleteRequest | NextLineRequest | CompleteContextRequest | FocusElementRequest;

// 开始上下文命令的接口
interface StartContextCommand {
    command: 'startContext'; // 命令类型
    key: number;      // 新增的索引属性
    label: string; // 标签
}

// 结束上下文命令的接口
interface EndContextCommand {
    command: 'endContext'; // 命令类型
}

// 创建一个新的输入框命令的接口，添加 index 属性
export interface CreateInputCommand {
    command: 'createInput'; // 命令类型
    key: number;      // 新增的索引属性
    inputValue: string; // 输入值
}

// 创建标签命令的接口
export interface CreateLabelCommand {
    command: 'createLabel'; // 命令类型
    label: string; // 标签
}

// 创建分隔符命令的接口
export interface CreateSplitCommand {
    command: 'createSplit'; // 命令类型
    text: string; // 文本
    leftMargin?: number; // 左边距
    rightMargin?: number; // 右边距
}

export interface Range {
    start: number;
    end: number;
}

// 删除命令的接口
export interface DeleteCommand {
    command: 'delete';  // 命令类型
    range: Range;       // 删除的范围，0表示原点，负数表示原点前，正数表示原点后，前闭后闭
}

// 换行响应的接口
export interface NextLineResponse {
    command: 'nextLine'; // 命令类型
    indent: number; // 缩进
}

// 光标移动到目标位置命令
export interface MoveCommand {
    command: 'move';            // 命令类型
    toLocation: Location;       // 目标位置
    offset: number;             // 相对目标位置的偏移量
    moveToContext?: boolean;    // 是否在上下文中移动
}

// 命令类型，可以是开始上下文、结束上下文、创建输入框、创建标签、创建分隔符、删除、换行响应或切换位置命令
export type Command = StartContextCommand | EndContextCommand
    | CreateInputCommand | CreateLabelCommand | CreateSplitCommand
    | DeleteCommand | NextLineResponse | MoveCommand;

export type CommandName = Command["command"];

// 输入框输入内容发生变化事件的请求接口，用于更新候选词
export interface InputUpdateRequest {
    type: 'inputUpdate'; // 请求类型
    location: Location; // 位置
    inputValue: string; // 输入值
}

// 已打开资源ID的接口
export interface OpenedResourceId {
    resourceId: string; // 资源ID
    commandList: Array<Command>; // 命令列表
}

// 已关闭资源ID的接口
export interface ClosedResourceId {
    command: 'closed'; // 命令类型
    resourceId: string; // 资源ID
}

// Token服务接口
export interface TokenService {
    /**
     * 打开资源
     * @param resourceId 资源ID，可选参数
     * @returns 异步的已打开资源ID
     */
    open(resourceId?: string): Promise<OpenedResourceId>;

    /**
     * 关闭资源
     * @param resourceId 资源ID
     * @returns 异步的已关闭资源ID
     */
    close(resourceId: string): Promise<ClosedResourceId>;

    /**
     * 发送请求
     * @param resourceId 资源ID
     * @param req 请求数组
     * @returns 异步的响应
     */
    send(resourceId: string, req: Array<Request>): Promise<Array<Command>>;

    /**
     * 获取候选词的方法
     * @param resouceId 资源Id
     * @param req InputUpdateRequest类型的请求参数
     * @returns 异步的候选词列表
     */
    getCandidateTokens(resouceId: string, req: InputUpdateRequest): Promise<Array<string>>;
}
